package modelo.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Actividad;
import modelo.servicio.Areas;
import modelo.servicio.Condicionantes;
import modelo.servicio.Documentos;
import modelo.servicio.Historicos;

public class ActividadDAO { //extends AbstractDAO<Actividad> {

    private String query;

    public void add(Actividad entity) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            /*
             * PROCEDURE [dbo].[SSMA_ALTER_ACTIVIDAD_P] @ACCION varchar(1),
             * @USUARIO varchar(25), @ID_ACTIVIDAD int, @DESCRIPCION
             * varchar(150), @FE VARCHAR(10), @ESTADO varchar(2), @ID_AREA int,
             * @ID_CONDICIONANTE int
             */
            query = "EXEC SSMA_ALTER_ACTIVIDAD_P ";
            query += "'I'";
            query += ", '" + entity.getHistorico().getUsuarioCrea().replace("'", "''") + "'";
            query += ", 0";
            query += ", '" + entity.getDescripcion().replace("'", "''") + "'";
            query += ", '" + (new SimpleDateFormat("dd/MM/yyyy").format(entity.getFecha())) + "'";
            query += ", 'PD'";
            query += ", " + entity.getArea().getIdArea();
            if (entity.getCondicionante() != null) {
                query += ", " + entity.getCondicionante().getIdCondicionante();
            } else {
                query += ", NULL";
            }
            query += ", NULL ";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
//            con.ejecutarActualizacion(getQuery());
        } catch (SQLException ex) {
            throw new DAOException("1 ACDA-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 ACDA-SQL " + ex.getMessage());
            }
        }
    }

    public void update(Actividad entity) throws DAOException {
        PreparedStatement sentencia = null;
        Connection conexion = null;
        try {
            /*
             * PROCEDURE [dbo].[SSMA_ALTER_ACTIVIDAD_P] @ACCION varchar(1),
             * @USUARIO varchar(25), @ID_ACTIVIDAD int, @DESCRIPCION
             * varchar(150), @FE VARCHAR(10), @ESTADO varchar(2), @ID_AREA int,
             * @ID_CONDICIONANTE int
             */
            query = "EXEC SSMA_ALTER_ACTIVIDAD_P ";
            query += "'U'";
            query += ", '" + entity.getHistorico().getUsuarioMod().replace("'", "''") + "'";
            query += ", " + entity.getIdActividad();
            query += ", '" + entity.getDescripcion().replace("'", "''") + "'";
            query += ", '" + (new SimpleDateFormat("dd/MM/yyyy").format(entity.getFecha())) + "'";
            query += ", '" + entity.getHistorico().getEstado().replace("'", "''") + "'";
            query += ", " + entity.getArea().getIdArea();
            if (entity.getCondicionante() != null) {
                query += ", " + entity.getCondicionante().getIdCondicionante();
            } else {
                query += ", NULL";
            }
            query += entity.getDocumento() == null ? ", NULL" : (", '" + entity.getDocumento().getClave().replace("'", "''") + "'");
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 ACDU-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 ACDU-SQL " + ex.getMessage());
            }
        }
    }

    protected synchronized List<Actividad> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Actividad> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Actividad>();
            while (resultado.next()) {
                Actividad actividad = new Actividad();
                actividad.setIdActividad(resultado.getInt("ID_ACTIVIDAD"));
                actividad.setDescripcion(resultado.getString("DESCRIPCION"));
                actividad.setArea(Areas.instancia().obtenerPorId(resultado.getInt("ID_AREA")));
                actividad.setCondicionante(Condicionantes.instancia().obtenerPorId(resultado.getInt("ID_CONDICIONANTE")));
                actividad.setFecha(resultado.getDate("FECHA"));
                actividad.setHistorico(Historicos.instancia().obtenerPorId(resultado.getInt("ID_HISTORICO")));
                if (resultado.getString("CLAVE_DOC") != null) {
                    actividad.setDocumento(Documentos.instancia().obtenerPorId(resultado.getString("CLAVE_DOC")));
                }
                resultados.add(actividad);
            }
        } catch (SQLException ex) {
            throw new DAOException("1 ACDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 ACDS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Actividad> selectAll() throws DAOException {
        query = "SELECT ID_ACTIVIDAD\n"
                + "      ,DESCRIPCION\n"
                + "      ,FECHA\n"
                + "      ,ID_AREA\n"
                + "      ,ID_HISTORICO\n"
                + "      ,ID_CONDICIONANTE\n"
                + "      ,CLAVE_DOC "
                + "FROM SSMA_ACTIVIDADES_T "
                + "WHERE ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        return select();
    }

    public List<Actividad> selectWhere(String condition) throws DAOException {
        query = "SELECT ID_ACTIVIDAD\n"
                + "      ,DESCRIPCION\n"
                + "      ,FECHA\n"
                + "      ,ID_AREA\n"
                + "      ,ID_HISTORICO\n"
                + "      ,ID_CONDICIONANTE\n"
                + "      ,CLAVE_DOC "
                + "FROM SSMA_ACTIVIDADES_T WHERE (" + condition + ") "
                + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        return select();
    }

    public synchronized int selectCount(Integer area) throws DAOException {
        PreparedStatement sentencia = null;
        Connection conexion = null;
        ResultSet resultado = null;
        int contador = 0;
        try {
            query = "SELECT COUNT(1) AS CUENTA "
                    + "FROM SSMA_ACTIVIDADES_T "
                    + "WHERE ID_AREA = " + area
                    + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO "
                    + "                         FROM SSMA_HISTORICO_T "
                    + "                         WHERE ESTADO = 'IN')";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                contador = resultado.getInt("CUENTA");
            } else {
                contador = 0;
            }
            boolean si = conexion.getAutoCommit();
        } catch (SQLException ex) {
            throw new DAOException("3 ACDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("4 ACDS-SQL " + ex.getMessage());
            }
        }
        return contador;
    }

    public long[] selectCounts(Integer area) throws DAOException {
        PreparedStatement sentencia = null;
        Connection conexion = null;
        ResultSet resultado = null;
        long contadores[];
        try {
            query = "SELECT COUNT(1) AS CUENTA \n"
                    + "FROM   SSMA_ACTIVIDADES_T \n"
                    + "WHERE  ID_AREA       = " + area +" \n"
                    + "AND    ID_HISTORICO IN (SELECT ID_HISTORICO \n"
                    + "                        FROM SSMA_HISTORICO_T \n"
                    + "                        WHERE ESTADO != 'IN')\n"
                    + "\n"
                    + "UNION ALL\n"
                    + "SELECT COUNT(1) \n"
                    + "FROM   SSMA_ACTIVIDADES_T \n"
                    + "WHERE  ID_AREA       = "+ area +" \n"
                    + "AND    ID_HISTORICO IN (SELECT ID_HISTORICO \n"
                    + "                        FROM SSMA_HISTORICO_T \n"
                    + "                        WHERE ESTADO = 'OK')\n"
                    + "UNION ALL\n"
                    + "SELECT COUNT(1) \n"
                    + "FROM   SSMA_ACTIVIDADES_T \n"
                    + "WHERE  ID_AREA       = "+ area +" \n"
                    + "AND    ID_HISTORICO IN (SELECT ID_HISTORICO \n"
                    + "                        FROM SSMA_HISTORICO_T \n"
                    + "                        WHERE ESTADO = 'NP')\n"
                    + "UNION ALL\n"
                    + "SELECT COUNT(1) \n"
                    + "FROM   SSMA_ACTIVIDADES_T \n"
                    + "WHERE  ID_AREA       = "+ area +" \n"
                    + "AND    ID_HISTORICO IN (SELECT ID_HISTORICO \n"
                    + "                        FROM SSMA_HISTORICO_T \n"
                    + "                        WHERE ESTADO = 'PV')\n"
                    + "UNION ALL\n"
                    + "SELECT COUNT(1) \n"
                    + "FROM   SSMA_ACTIVIDADES_T \n"
                    + "WHERE  ID_AREA       = "+ area +" \n"
                    + "AND    ID_HISTORICO IN (SELECT ID_HISTORICO \n"
                    + "                        FROM SSMA_HISTORICO_T \n"
                    + "                        WHERE ESTADO = 'PD')";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();

            boolean si = conexion.getAutoCommit();
            contadores = new long[5];
            int i = 0;
            while (resultado.next()) {
                contadores[i] = resultado.getLong(1);
                i++;
            }
        } catch (SQLException ex) {
            throw new DAOException("5 ACDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("6 ACDS-SQL " + ex.getMessage());
            }
        }
        return contadores;
    }
}
